<h2>DESCRIPTION</h2>

<em>v.surf.bspline</em> performs a bilinear/bicubic spline
interpolation with Tykhonov regularization. The <b>input</b> is a 2D
or 3D vector <em>points</em> map. Values to interpolate can be the z
values of 3D points or the values in a user-specified attribute column
in a 2D or 3D vector map. Output can be a raster
(<b>raster_output</b>) or vector (<b>output</b>) map.  Optionally, a
"sparse point" vector map can be input which indicates the location
of <b>output</b> vector points.

<h2>NOTES</h2>

<p>From a theoretical perspective, the interpolating procedure takes 
place in two parts: the first is an estimate of the linear coefficients 
of a spline function is derived from the observation points using a 
least squares regression; the second is the computation of the 
interpolated surface (or interpolated vector points). As used here, the 
splines are 2D piece-wise non-zero polynomial functions calculated 
within a limited, 2D area. The length (in mapping units) of each spline 
step is defined by <b>ew_step</b> for the east-west direction and 
<b>ns_step</b> for the north-south direction. For optimal performance, 
the length of spline step should be no less than the distance between 
observation points. Each vector point observation is modeled as a 
linear function of the non-zero splines in the area around the 
observation. The least squares regression predicts the the coefficients 
of these linear functions. Regularization, avoids the need to have one 
observation and one coefficient for each spline (in order to avoid 
instability). 

<p>With regularly distributed data points, a spline step corresponding
to the maximum distance between two points in both the east and north
directions is sufficient. But often data points are not regularly
distributed and require statistial regularization or estimation. In
such cases, v.surf.bspline will attempt to minimize the gradient of
bilinear splines or the curvature of bicubic splines in areas lacking
point observations. As a general rule, spline step length should be
greater than the mean distance between observation points (twice the
distance between points is a good starting point). Separate east-west
and north-south spline step length arguments allows the user to
account for some degree of anisotropy in the distribution of
observation points. Short spline step lengths - especially spline step
lengths that are less than the distance between observation points -
can greatly increase the processing time.

<p>Moreover, the maximum number of splines for each direction at each
time is fixed, regardless of the spline step length. As the total
number of splines used increases (i.e., with small spline step
lengths), the region is automatically split into subregions for
interpolation. Each subregion can contain no more than 150x150
splines. To avoid subregion boundary problems, subregions are created
to partially overlap each other. A weighted mean of observations,
based on point locations, is calculated within each subregion.

<p>The Tykhonov regularization parameter (<b>lambda_i</b>) acts to
smooth the interpolation. With a small <b>lambda_i</b>, the
interpolated surface closely follows observation points; a larger
value will produce a smoother interpolation.

<p>The input can be a 2D or 3D vector points map. If input is 3D
and <b>column</b> is not given than z-coordinates are used for
interpolation. Parameter <b>column</b> is required when input is 2D
vector map.

<p><em>v.surf.bspline</em> can produce a <b>raster_output</b> OR
a <b>output</b> (but NOT simultaneously). Note that topology is not
build for output vector point map. The topology can be built if
required by <em><a href="v.build.html">v.build</a></em>.

<p>If output is a vector points map and a <b>sparse</b> vector points
map is not specified, the output vector map will contain points at the
same locations as observation points in the input map, but the values
of the output points are interpolated values. If instead
a <b>sparse</b> vector points map is specified, the output vector map
will contain points at the same locations as the sparse vector map
points, and values will be those of the interpolated raster surface at
those points.

<p>A cross validation "leave-one-out" analysis is available to help to
determine the optimal <b>lambda_i</b> value that produces an
interpolation that best fits the original observation data. The more
points used for cross-validation, the longer the time needed for
computation. Empirical testing indicates a threshold of a maximum of
100 points is recommended. Note that cross validation can run very
slowly if more than 100 observations are used. The cross-validation
output reports <i>mean</i> and <i>rms</i> of the residuals from the
true point value and the estimated from the interpolation for a fixed
series of <b>lambda_i</b> values. No vector nor raster output will be
created when cross-validation is selected.


<h2>EXAMPLES</h2>

<h3>Basic interpolation</h3>

<div class="code"><pre>
v.surf.bspline input=point_vector output=interpolate_surface method=bicubic
</pre></div>

A bicubic spline interpolation will be done and a vector points map
with estimated (i.e., interpolated) values will be created.

<h3>Basic interpolation and raster output with a longer spline step</h3>

<div class="code"><pre>
v.surf.bspline input=point_vector raster=interpolate_surface ew_step=25 ns_step=25
</pre></div>

A bilinear spline interpolation will be done with a spline step length
of 25 map units. An interpolated raster map will be created at the
current region resolution.

<h3>Estimation of lambda_i parameter with a cross validation process</h3>

<div class="code"><pre>
v.surf.bspline -c input=point_vector 
</pre></div>

<h3>Estimation on sparse points</h3>

<div class="code"><pre>
v.surf.bspline input=point_vector sparse=sparse_points output=interpolate_surface
</pre></div>

An output map of vector points will be created, corresponding to the
sparse vector map, with interpolated values.

<h3>Using attribute values instead z-coordinates</h3>

<div class="code"><pre>
v.surf.bspline input=point_vector raster=interpolate_surface layer=1 \
  column=attrib_column
</pre></div>

The interpolation will be done using the values
in <i>attrib_column</i>, in the table associated with layer 1.

<h3>North carolina location example using z-coordinates for interpolation</h3>

<div class="code"><pre>
g.region region=rural_1m res=2 -p
v.surf.bspline input=elev_lid792_bepts raster=elev_lid792_rast \
  ew_step=5 ns_step=5 method=bicubic lambda_i=0.1
</pre></div>


<h2>KNOWN ISSUES</h2>

Known issues:

<p>
In order to avoid RAM memory problems, an auxiliary table is needed
for recording some intermediate calculations. This requires
the <i>GROUP BY</i> SQL function is used, which is not supported by
the DBF driver. For this reason, vector map output
(<b>output</b>) is not permitted with the DBF driver. There are
no problems with the raster map output from the DBF driver.

<h2>REFERENCES</h2>

<ul>
  <li>Brovelli M. A., Cannata M., and Longoni U.M., 2004, LIDAR Data
    Filtering and DTM Interpolation Within GRASS, Transactions in GIS,
    April 2004, vol. 8, iss. 2, pp. 155-174(20), Blackwell Publishing Ltd</li>
  <li>Brovelli M. A. and Cannata M., 2004, Digital Terrain model
    reconstruction in urban areas from airborne laser scanning data: the
    method and an example for Pavia (Northern Italy). Computers and
    Geosciences 30, pp.325-331</li>
  <li>Brovelli M. A e Longoni U.M., 2003, Software per il filtraggio di
    dati LIDAR, Rivista dell'Agenzia del Territorio, n. 3-2003, pp. 11-22
    (ISSN 1593-2192)</li>
  <li>Antolin R. and Brovelli M.A., 2007, LiDAR data Filtering with GRASS GIS for the 
    Determination of Digital Terrain Models. Proceedings of Jornadas de SIG Libre,
    Girona, Espa&ntilde;a. CD ISBN: 978-84-690-3886-9</li>
</ul>

<h2>SEE ALSO</h2>

<em>
<a href="v.surf.idw.html">v.surf.idw</a>,
<a href="v.surf.rst.html">v.surf.rst</a>
</em>

<p>
Overview: <a href="https://grasswiki.osgeo.org/wiki/Interpolation">Interpolation and Resampling</a> in GRASS GIS

<h2>AUTHORS</h2>

Original version (s.bspline.reg) in GRASS 5.4:
Maria Antonia Brovelli, Massimiliano Cannata, Ulisse Longoni, Mirko Reguzzoni<br>
Update for GRASS 6 and improvements: Roberto Antolin

<!--
<p>
<i>Last changed: $Date$</i>
-->
